gl renderer: Properly clean up program state transforms
authorTimm Bäder <mail@baedert.org>
Sat, 6 Jul 2019 11:38:55 +0000 (13:38 +0200)
committerTimm Bäder <mail@baedert.org>
Sun, 7 Jul 2019 05:24:00 +0000 (07:24 +0200)
gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h

index f464c728a5caf476c24d08e6a0a80b5784819073..46c9e64c1ce441a702d928f9eba418934a7fbe2d 100644 (file)
@@ -2342,6 +2342,7 @@ gsk_gl_renderer_dispose (GObject *gobject)
   GskGLRenderer *self = GSK_GL_RENDERER (gobject);
 
   g_clear_pointer (&self->render_ops, g_array_unref);
+  ops_free (&self->op_builder);
 
   G_OBJECT_CLASS (gsk_gl_renderer_parent_class)->dispose (gobject);
 }
index b23e8c5cde6cddf09efbece5dd7b0923ad9a3873..7c02442d08ae2d6fe774c4dc5829f49735072a78 100644 (file)
@@ -187,6 +187,17 @@ ops_init (RenderOpBuilder *builder)
     }
 }
 
+void
+ops_free (RenderOpBuilder *builder)
+{
+  int i;
+
+  for (i = 0; i < GL_N_PROGRAMS; i ++)
+    {
+      gsk_transform_unref (builder->program_state[i].modelview);
+    }
+}
+
 void
 ops_set_program (RenderOpBuilder *builder,
                  const Program   *program)
@@ -225,6 +236,7 @@ ops_set_program (RenderOpBuilder *builder,
       op.op = OP_CHANGE_MODELVIEW;
       gsk_transform_to_matrix (builder->current_modelview, &op.modelview);
       g_array_append_val (builder->render_ops, op);
+      gsk_transform_unref (program_state->modelview);
       program_state->modelview = gsk_transform_ref (builder->current_modelview);
     }
 
index 84bafa74a074287ae2683031c0928c8b5ea75ff2..b58f01af05ef47d2390e55cc70bf1a34842a304c 100644 (file)
@@ -290,6 +290,7 @@ void              ops_dump_framebuffer   (RenderOpBuilder         *builder,
                                           int                      width,
                                           int                      height);
 void              ops_init               (RenderOpBuilder         *builder);
+void              ops_free               (RenderOpBuilder         *builder);
 void              ops_push_debug_group    (RenderOpBuilder         *builder,
                                            const char              *text);
 void              ops_pop_debug_group     (RenderOpBuilder         *builder);